import unittest

from beer_song import recite


# Tests adapted from `problem-specifications//canonical-data.json` @ v2.1.0

class BeerTest(unittest.TestCase):
    def test_first_generic_verse(self):
        expected = [
            "99 bottles of beer on the wall, 99 bottles of beer.",
            "Take one down and pass it around, 98 bottles of beer on the wall."
        ]
        self.assertEqual(recite(start=99), expected)

    def test_last_generic_verse(self):
        expected = [
            "3 bottles of beer on the wall, 3 bottles of beer.",
            "Take one down and pass it around, 2 bottles of beer on the wall."
        ]
        self.assertEqual(recite(start=3), expected)

    def test_verse_with_two_bottles(self):
        expected = [
            "2 bottles of beer on the wall, 2 bottles of beer.",
            "Take one down and pass it around, 1 bottle of beer on the wall."
        ]
        self.assertEqual(recite(start=2), expected)

    def test_verse_with_one_bottle(self):
        expected = [
            "1 bottle of beer on the wall, 1 bottle of beer.",
            (
                "Take it down and pass it around, "
                "no more bottles of beer on the wall."
            )
        ]
        self.assertEqual(recite(start=1), expected)

    def test_verse_with_zero_bottles(self):
        expected = [
            "No more bottles of beer on the wall, no more bottles of beer.",
            (
                "Go to the store and buy some more, "
                "99 bottles of beer on the wall."
            )
        ]
        self.assertEqual(recite(start=0), expected)

    def test_first_two_verses(self):
        expected = [
            "99 bottles of beer on the wall, 99 bottles of beer.",
            (
                "Take one down and pass it around, "
                "98 bottles of beer on the wall."
            ),
            "",
            "98 bottles of beer on the wall, 98 bottles of beer.",
            "Take one down and pass it around, 97 bottles of beer on the wall."
        ]
        self.assertEqual(recite(start=99, take=2), expected)

    def test_last_three_verses(self):
        expected = [
            "2 bottles of beer on the wall, 2 bottles of beer.",
            "Take one down and pass it around, 1 bottle of beer on the wall.",
            "",
            "1 bottle of beer on the wall, 1 bottle of beer.",
            (
                "Take it down and pass it around, "
                "no more bottles of beer on the wall."
            ),
            "",
            "No more bottles of beer on the wall, no more bottles of beer.",
            (
                "Go to the store and buy some more, "
                "99 bottles of beer on the wall."
            )
        ]
        self.assertEqual(recite(start=2, take=3), expected)

    def test_all_verses(self):
        self.assertEqual(recite(start=99, take=100), SONG)


SONG = [
    "99 bottles of beer on the wall, 99 bottles of beer.",
    "Take one down and pass it around, 98 bottles of beer on the wall.",
    "",
    "98 bottles of beer on the wall, 98 bottles of beer.",
    "Take one down and pass it around, 97 bottles of beer on the wall.",
    "",
    "97 bottles of beer on the wall, 97 bottles of beer.",
    "Take one down and pass it around, 96 bottles of beer on the wall.",
    "",
    "96 bottles of beer on the wall, 96 bottles of beer.",
    "Take one down and pass it around, 95 bottles of beer on the wall.",
    "",
    "95 bottles of beer on the wall, 95 bottles of beer.",
    "Take one down and pass it around, 94 bottles of beer on the wall.",
    "",
    "94 bottles of beer on the wall, 94 bottles of beer.",
    "Take one down and pass it around, 93 bottles of beer on the wall.",
    "",
    "93 bottles of beer on the wall, 93 bottles of beer.",
    "Take one down and pass it around, 92 bottles of beer on the wall.",
    "",
    "92 bottles of beer on the wall, 92 bottles of beer.",
    "Take one down and pass it around, 91 bottles of beer on the wall.",
    "",
    "91 bottles of beer on the wall, 91 bottles of beer.",
    "Take one down and pass it around, 90 bottles of beer on the wall.",
    "",
    "90 bottles of beer on the wall, 90 bottles of beer.",
    "Take one down and pass it around, 89 bottles of beer on the wall.",
    "",
    "89 bottles of beer on the wall, 89 bottles of beer.",
    "Take one down and pass it around, 88 bottles of beer on the wall.",
    "",
    "88 bottles of beer on the wall, 88 bottles of beer.",
    "Take one down and pass it around, 87 bottles of beer on the wall.",
    "",
    "87 bottles of beer on the wall, 87 bottles of beer.",
    "Take one down and pass it around, 86 bottles of beer on the wall.",
    "",
    "86 bottles of beer on the wall, 86 bottles of beer.",
    "Take one down and pass it around, 85 bottles of beer on the wall.",
    "",
    "85 bottles of beer on the wall, 85 bottles of beer.",
    "Take one down and pass it around, 84 bottles of beer on the wall.",
    "",
    "84 bottles of beer on the wall, 84 bottles of beer.",
    "Take one down and pass it around, 83 bottles of beer on the wall.",
    "",
    "83 bottles of beer on the wall, 83 bottles of beer.",
    "Take one down and pass it around, 82 bottles of beer on the wall.",
    "",
    "82 bottles of beer on the wall, 82 bottles of beer.",
    "Take one down and pass it around, 81 bottles of beer on the wall.",
    "",
    "81 bottles of beer on the wall, 81 bottles of beer.",
    "Take one down and pass it around, 80 bottles of beer on the wall.",
    "",
    "80 bottles of beer on the wall, 80 bottles of beer.",
    "Take one down and pass it around, 79 bottles of beer on the wall.",
    "",
    "79 bottles of beer on the wall, 79 bottles of beer.",
    "Take one down and pass it around, 78 bottles of beer on the wall.",
    "",
    "78 bottles of beer on the wall, 78 bottles of beer.",
    "Take one down and pass it around, 77 bottles of beer on the wall.",
    "",
    "77 bottles of beer on the wall, 77 bottles of beer.",
    "Take one down and pass it around, 76 bottles of beer on the wall.",
    "",
    "76 bottles of beer on the wall, 76 bottles of beer.",
    "Take one down and pass it around, 75 bottles of beer on the wall.",
    "",
    "75 bottles of beer on the wall, 75 bottles of beer.",
    "Take one down and pass it around, 74 bottles of beer on the wall.",
    "",
    "74 bottles of beer on the wall, 74 bottles of beer.",
    "Take one down and pass it around, 73 bottles of beer on the wall.",
    "",
    "73 bottles of beer on the wall, 73 bottles of beer.",
    "Take one down and pass it around, 72 bottles of beer on the wall.",
    "",
    "72 bottles of beer on the wall, 72 bottles of beer.",
    "Take one down and pass it around, 71 bottles of beer on the wall.",
    "",
    "71 bottles of beer on the wall, 71 bottles of beer.",
    "Take one down and pass it around, 70 bottles of beer on the wall.",
    "",
    "70 bottles of beer on the wall, 70 bottles of beer.",
    "Take one down and pass it around, 69 bottles of beer on the wall.",
    "",
    "69 bottles of beer on the wall, 69 bottles of beer.",
    "Take one down and pass it around, 68 bottles of beer on the wall.",
    "",
    "68 bottles of beer on the wall, 68 bottles of beer.",
    "Take one down and pass it around, 67 bottles of beer on the wall.",
    "",
    "67 bottles of beer on the wall, 67 bottles of beer.",
    "Take one down and pass it around, 66 bottles of beer on the wall.",
    "",
    "66 bottles of beer on the wall, 66 bottles of beer.",
    "Take one down and pass it around, 65 bottles of beer on the wall.",
    "",
    "65 bottles of beer on the wall, 65 bottles of beer.",
    "Take one down and pass it around, 64 bottles of beer on the wall.",
    "",
    "64 bottles of beer on the wall, 64 bottles of beer.",
    "Take one down and pass it around, 63 bottles of beer on the wall.",
    "",
    "63 bottles of beer on the wall, 63 bottles of beer.",
    "Take one down and pass it around, 62 bottles of beer on the wall.",
    "",
    "62 bottles of beer on the wall, 62 bottles of beer.",
    "Take one down and pass it around, 61 bottles of beer on the wall.",
    "",
    "61 bottles of beer on the wall, 61 bottles of beer.",
    "Take one down and pass it around, 60 bottles of beer on the wall.",
    "",
    "60 bottles of beer on the wall, 60 bottles of beer.",
    "Take one down and pass it around, 59 bottles of beer on the wall.",
    "",
    "59 bottles of beer on the wall, 59 bottles of beer.",
    "Take one down and pass it around, 58 bottles of beer on the wall.",
    "",
    "58 bottles of beer on the wall, 58 bottles of beer.",
    "Take one down and pass it around, 57 bottles of beer on the wall.",
    "",
    "57 bottles of beer on the wall, 57 bottles of beer.",
    "Take one down and pass it around, 56 bottles of beer on the wall.",
    "",
    "56 bottles of beer on the wall, 56 bottles of beer.",
    "Take one down and pass it around, 55 bottles of beer on the wall.",
    "",
    "55 bottles of beer on the wall, 55 bottles of beer.",
    "Take one down and pass it around, 54 bottles of beer on the wall.",
    "",
    "54 bottles of beer on the wall, 54 bottles of beer.",
    "Take one down and pass it around, 53 bottles of beer on the wall.",
    "",
    "53 bottles of beer on the wall, 53 bottles of beer.",
    "Take one down and pass it around, 52 bottles of beer on the wall.",
    "",
    "52 bottles of beer on the wall, 52 bottles of beer.",
    "Take one down and pass it around, 51 bottles of beer on the wall.",
    "",
    "51 bottles of beer on the wall, 51 bottles of beer.",
    "Take one down and pass it around, 50 bottles of beer on the wall.",
    "",
    "50 bottles of beer on the wall, 50 bottles of beer.",
    "Take one down and pass it around, 49 bottles of beer on the wall.",
    "",
    "49 bottles of beer on the wall, 49 bottles of beer.",
    "Take one down and pass it around, 48 bottles of beer on the wall.",
    "",
    "48 bottles of beer on the wall, 48 bottles of beer.",
    "Take one down and pass it around, 47 bottles of beer on the wall.",
    "",
    "47 bottles of beer on the wall, 47 bottles of beer.",
    "Take one down and pass it around, 46 bottles of beer on the wall.",
    "",
    "46 bottles of beer on the wall, 46 bottles of beer.",
    "Take one down and pass it around, 45 bottles of beer on the wall.",
    "",
    "45 bottles of beer on the wall, 45 bottles of beer.",
    "Take one down and pass it around, 44 bottles of beer on the wall.",
    "",
    "44 bottles of beer on the wall, 44 bottles of beer.",
    "Take one down and pass it around, 43 bottles of beer on the wall.",
    "",
    "43 bottles of beer on the wall, 43 bottles of beer.",
    "Take one down and pass it around, 42 bottles of beer on the wall.",
    "",
    "42 bottles of beer on the wall, 42 bottles of beer.",
    "Take one down and pass it around, 41 bottles of beer on the wall.",
    "",
    "41 bottles of beer on the wall, 41 bottles of beer.",
    "Take one down and pass it around, 40 bottles of beer on the wall.",
    "",
    "40 bottles of beer on the wall, 40 bottles of beer.",
    "Take one down and pass it around, 39 bottles of beer on the wall.",
    "",
    "39 bottles of beer on the wall, 39 bottles of beer.",
    "Take one down and pass it around, 38 bottles of beer on the wall.",
    "",
    "38 bottles of beer on the wall, 38 bottles of beer.",
    "Take one down and pass it around, 37 bottles of beer on the wall.",
    "",
    "37 bottles of beer on the wall, 37 bottles of beer.",
    "Take one down and pass it around, 36 bottles of beer on the wall.",
    "",
    "36 bottles of beer on the wall, 36 bottles of beer.",
    "Take one down and pass it around, 35 bottles of beer on the wall.",
    "",
    "35 bottles of beer on the wall, 35 bottles of beer.",
    "Take one down and pass it around, 34 bottles of beer on the wall.",
    "",
    "34 bottles of beer on the wall, 34 bottles of beer.",
    "Take one down and pass it around, 33 bottles of beer on the wall.",
    "",
    "33 bottles of beer on the wall, 33 bottles of beer.",
    "Take one down and pass it around, 32 bottles of beer on the wall.",
    "",
    "32 bottles of beer on the wall, 32 bottles of beer.",
    "Take one down and pass it around, 31 bottles of beer on the wall.",
    "",
    "31 bottles of beer on the wall, 31 bottles of beer.",
    "Take one down and pass it around, 30 bottles of beer on the wall.",
    "",
    "30 bottles of beer on the wall, 30 bottles of beer.",
    "Take one down and pass it around, 29 bottles of beer on the wall.",
    "",
    "29 bottles of beer on the wall, 29 bottles of beer.",
    "Take one down and pass it around, 28 bottles of beer on the wall.",
    "",
    "28 bottles of beer on the wall, 28 bottles of beer.",
    "Take one down and pass it around, 27 bottles of beer on the wall.",
    "",
    "27 bottles of beer on the wall, 27 bottles of beer.",
    "Take one down and pass it around, 26 bottles of beer on the wall.",
    "",
    "26 bottles of beer on the wall, 26 bottles of beer.",
    "Take one down and pass it around, 25 bottles of beer on the wall.",
    "",
    "25 bottles of beer on the wall, 25 bottles of beer.",
    "Take one down and pass it around, 24 bottles of beer on the wall.",
    "",
    "24 bottles of beer on the wall, 24 bottles of beer.",
    "Take one down and pass it around, 23 bottles of beer on the wall.",
    "",
    "23 bottles of beer on the wall, 23 bottles of beer.",
    "Take one down and pass it around, 22 bottles of beer on the wall.",
    "",
    "22 bottles of beer on the wall, 22 bottles of beer.",
    "Take one down and pass it around, 21 bottles of beer on the wall.",
    "",
    "21 bottles of beer on the wall, 21 bottles of beer.",
    "Take one down and pass it around, 20 bottles of beer on the wall.",
    "",
    "20 bottles of beer on the wall, 20 bottles of beer.",
    "Take one down and pass it around, 19 bottles of beer on the wall.",
    "",
    "19 bottles of beer on the wall, 19 bottles of beer.",
    "Take one down and pass it around, 18 bottles of beer on the wall.",
    "",
    "18 bottles of beer on the wall, 18 bottles of beer.",
    "Take one down and pass it around, 17 bottles of beer on the wall.",
    "",
    "17 bottles of beer on the wall, 17 bottles of beer.",
    "Take one down and pass it around, 16 bottles of beer on the wall.",
    "",
    "16 bottles of beer on the wall, 16 bottles of beer.",
    "Take one down and pass it around, 15 bottles of beer on the wall.",
    "",
    "15 bottles of beer on the wall, 15 bottles of beer.",
    "Take one down and pass it around, 14 bottles of beer on the wall.",
    "",
    "14 bottles of beer on the wall, 14 bottles of beer.",
    "Take one down and pass it around, 13 bottles of beer on the wall.",
    "",
    "13 bottles of beer on the wall, 13 bottles of beer.",
    "Take one down and pass it around, 12 bottles of beer on the wall.",
    "",
    "12 bottles of beer on the wall, 12 bottles of beer.",
    "Take one down and pass it around, 11 bottles of beer on the wall.",
    "",
    "11 bottles of beer on the wall, 11 bottles of beer.",
    "Take one down and pass it around, 10 bottles of beer on the wall.",
    "",
    "10 bottles of beer on the wall, 10 bottles of beer.",
    "Take one down and pass it around, 9 bottles of beer on the wall.",
    "",
    "9 bottles of beer on the wall, 9 bottles of beer.",
    "Take one down and pass it around, 8 bottles of beer on the wall.",
    "",
    "8 bottles of beer on the wall, 8 bottles of beer.",
    "Take one down and pass it around, 7 bottles of beer on the wall.",
    "",
    "7 bottles of beer on the wall, 7 bottles of beer.",
    "Take one down and pass it around, 6 bottles of beer on the wall.",
    "",
    "6 bottles of beer on the wall, 6 bottles of beer.",
    "Take one down and pass it around, 5 bottles of beer on the wall.",
    "",
    "5 bottles of beer on the wall, 5 bottles of beer.",
    "Take one down and pass it around, 4 bottles of beer on the wall.",
    "",
    "4 bottles of beer on the wall, 4 bottles of beer.",
    "Take one down and pass it around, 3 bottles of beer on the wall.",
    "",
    "3 bottles of beer on the wall, 3 bottles of beer.",
    "Take one down and pass it around, 2 bottles of beer on the wall.",
    "",
    "2 bottles of beer on the wall, 2 bottles of beer.",
    "Take one down and pass it around, 1 bottle of beer on the wall.",
    "",
    "1 bottle of beer on the wall, 1 bottle of beer.",
    "Take it down and pass it around, no more bottles of beer on the wall.",
    "",
    "No more bottles of beer on the wall, no more bottles of beer.",
    "Go to the store and buy some more, 99 bottles of beer on the wall."
]


if __name__ == '__main__':
    unittest.main()
